package com.lhkj.ct.base.utils.file.word.xwpf;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.awt.*;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;

/**
  * <p>
  *     描述：操作word表格的基本工具类
  * </p>
  */
public class XWPFTableHelper {

    /**
     * 跨列合并 index 从 0 开始
     * @param table
     *                  操作的表格
     * @param row
     *                  所合并的行
     * @param fromCol
     *                  起始列
     * @param toCol
     *                  终止列
     *
     *
     */
    public void mergeCellsHorizontal(XWPFTable table, int row, int fromCol, int toCol) {
        for (int cellIndex = fromCol; cellIndex <= toCol; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if (cellIndex == fromCol) {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    /**
     * 跨行合并 index 从 0 开始
     *
     * @param table
     *                  操作的表格
     * @param col
     *                  合并的列
     * @param fromRow
     *                  起始行
     * @param toRow
     *                  终止行
     */
    public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            //第一个合并单元格用重启合并值设置
            if (rowIndex == fromRow) {
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                //合并第一个单元格的单元被设置为“继续”
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    /**
     * 设置表格行颜色和对齐方式
     *
     * @param infoTable
     *                  操作的表格
     * @param row
     *                  表格第row行（从0开始）
     * @param rgbStr
     *                  颜色 rgb字符串 如："dddddd"
     * @param vAlign
     *                  垂直对齐方式
     * @param align
     *                  水平对齐方式
     */
    public void setTableRowStyle(XWPFTable infoTable, int row, String rgbStr, XWPFTableCell.XWPFVertAlign vAlign, STJc.Enum align) {
        List<XWPFTableRow> rows = infoTable.getRows();
        if (row > rows.size()) {
            return;
        }
        setTableRowStyle(rows.get(row), rgbStr, vAlign, align);
    }

    /**
     * 设置表格行颜色和对齐方式
     *
     * @param tableRow
     *                  表格行
     * @param rgbStr
     *                  颜色
     * @param vAlign
     *                  垂直对齐方式
     * @param align
     *                  水平对齐方式
     */
    public void setTableRowStyle(XWPFTableRow tableRow, String rgbStr, XWPFTableCell.XWPFVertAlign vAlign, STJc.Enum align) {
        List<XWPFTableCell> cells = tableRow.getTableCells();
        for (XWPFTableCell tableCell : cells) {
            if (StringUtils.isNotBlank(rgbStr)) {
                tableCell.setColor(rgbStr);
            }
            if (null != vAlign) {
                // 设置单元格内容垂直对齐方式
                tableCell.setVerticalAlignment(vAlign);
            }
            if (null != align){
                CTTc cttc = tableCell.getCTTc();
                // 设置单元格内容水平对齐方式
                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(align);
            }
        }
    }

    public void setTableCellFont(XWPFTableCell cell, Font fontStyle, String cellText) {
        //获取 XWPFTableCell 的CTTc
        CTTc ctTc = cell.getCTTc();
        //获取 CTP
        CTP ctP = (ctTc.sizeOfPArray() == 0) ?
                ctTc.addNewP() : ctTc.getPArray(0);
        //getParagraph(ctP) 获取 XWPFParagraph
        XWPFParagraph par = cell.getParagraph(ctP);
        //XWPFRun   设置格式
        XWPFRun run = par.createRun();
        run.setFontSize(fontStyle.getSize());
        run.setFontFamily(fontStyle.getFamily());
        run.setText(cellText);
    }

    /**
     *
     * @param row
     *                  表格行
     * @param borderType
     *                  边框类型
     * @param sz
     *                  边框宽度
     * @param borderColor
     *                  边框颜色 rgb字符串 如："dddddd"
     */
    public void setTableRowBorder(XWPFTableRow row, STBorder.Enum borderType, Long sz, Object borderColor){
        CTTcPr tcPr = row.getCell(0).getCTTc().getTcPr() != null ? row.getCell(0).getCTTc().getTcPr(): row.getCell(0).getCTTc().addNewTcPr();
        CTTcBorders tblBorders = tcPr.addNewTcBorders();
        CTBorder top = tblBorders.addNewTop();
        top.setVal(borderType);
        top.setSz(BigInteger.valueOf(sz));
        top.setColor(borderColor);
        CTBorder right = tblBorders.addNewRight();
        right.setVal(borderType);
        right.setVal(borderType);
        right.setSz(BigInteger.valueOf(sz));
        right.setColor(borderColor);
        CTBorder bottom = tblBorders.addNewBottom();
        bottom.setVal(borderType);
        bottom.setVal(borderType);
        bottom.setSz(BigInteger.valueOf(sz));
        bottom.setColor(borderColor);
        CTBorder left = tblBorders.addNewLeft();
        left.setVal(borderType);
        left.setVal(borderType);
        left.setSz(BigInteger.valueOf(sz));
        left.setColor(borderColor);
        for (int i = 0; i < row.getTableCells().size(); i++) {
            row.getCell(i).getCTTc().addNewTcPr().setTcBorders(tblBorders);
        }
    }

    public void setRowAlign(XWPFTableRow row, XWPFTableCell.XWPFVertAlign vertAlign, STJc.Enum align) {
        for (XWPFTableCell cell : row.getTableCells()) {
            // 设置单元格内容垂直对齐方式
            cell.setVerticalAlignment(vertAlign);
            CTTc cttc = cell.getCTTc();
            // 设置单元格内容水平对齐方式
            cttc.getPList().get(0).addNewPPr().addNewJc().setVal(align);
        }
    }

    /**
     * 删除指定位置 {@param pos}的表格，被删除表格后的索引位置
     *
     * @param document
     *                  文档对象
     * @param pos
     *                  表格位置
     */
    public void deleteTableByIndex(XWPFDocument document, int pos) {
        Iterator<IBodyElement> bodyElement = document.getBodyElementsIterator();
        int eIndex = 0, tableIndex = -1;
        while (bodyElement.hasNext()) {
            IBodyElement element = bodyElement.next();
            BodyElementType elementType = element.getElementType();
            if (elementType == BodyElementType.TABLE) {
                tableIndex++;
                if (tableIndex == pos) {
                    break;
                }
            }
            eIndex++;
        }
        document.removeBodyElement(eIndex);
    }

    /**
     * 统一设置表格行高
     *
     * @param infoTable
     *                  操作的表格
     * @param height
     *                  行高
     * @param vertical
     *                  表格内容的显示方式：居中、靠右...
     */
    public void setTableRowsHeight(XWPFTable infoTable, int height, STVerticalJc.Enum vertical) {
        for (XWPFTableRow row : infoTable.getRows()) {
           setTableRowHeight(row, height, vertical);
        }
    }

    /**
     * 设置表格行高
     *
     * @param row
     *                  操作的表格行
     * @param height
     *                  行高
     * @param vertical
     *                  表格内容的显示方式：居中、靠右...
     */
    public void setTableRowHeight(XWPFTableRow row, int height, STVerticalJc.Enum vertical) {
        CTTrPr trPr = row.getCtRow().addNewTrPr();
        CTHeight ht = trPr.addNewTrHeight();
        ht.setVal(BigInteger.valueOf(height));
        if (null == vertical) {
            return;
        }
        List<XWPFTableCell> cells = row.getTableCells();
        for (XWPFTableCell tableCell : cells) {
            CTTcPr cttcpr = tableCell.getCTTc().addNewTcPr();
            cttcpr.addNewVAlign().setVal(vertical);
        }

    }

}
